import {InternalAxiosRequestConfig} from "axios"
import {SimpleTypeConst, jsonStringifyObjProps} from "st-common-core"
import {JsonHeaderNameConst} from 'st-common-req'
import {getEnv} from "@env"
import {EnvNameEnum, ExcludeReqDataJsonStringifyUrlList, ReqDataJsonStringifyUrlList} from '@config'

/**
 * 对请求数据进行 JSON.stringify 处理
 *
 * @param {InternalAxiosRequestConfig} config 请求配置对象
 */
export const reqDataJsonStringifyHandler = (config: InternalAxiosRequestConfig) => {
  // 如果在环境变量中配置了关闭对请求数据的 JSON.stringify 处理
  if (!getEnv<boolean>(EnvNameEnum.REQ_DATA_IS_JSON, SimpleTypeConst.BOOL)) return
  // 当前请求的 URL
  const url = config.url
  // 如果当前请求 URL 不需要对请求数据 JSON.stringify 处理
  for (const excludeUrl of ExcludeReqDataJsonStringifyUrlList) {
    if (excludeUrl === '*' || url === excludeUrl || url.startsWith(excludeUrl)) return
  }
  // 如果当前请求 URL 在需要对请求数据 JSON.stringify 处理的请求 URL 列表中
  for (const urlNeedGen of ReqDataJsonStringifyUrlList) {
    if (urlNeedGen === '*' || url === urlNeedGen || url.startsWith(urlNeedGen)) {
      // 对请求数据 JSON.stringify 处理
      if (config.method === 'get') {
        config.params = jsonStringifyObjProps({obj: config.params})
      } else {
        config.data = jsonStringifyObjProps({obj: config.data})
      }
      // 在请求头中表明请求数据经过了 JSON.stringify 处理
      config.headers[JsonHeaderNameConst.IS_JSON_STRINGIFY] = true
    }
  }
}
